"""
主题: *args和**kwargs的强制参数签名
问题: 你有一个函数或方法，它使用*args和**kwargs作为参数，这样使得它比较通用， 但有时候你想检查传递进来的参数是不是某个你想要的类型。
提示 : 
"""



def recipe1():
    from inspect import Signature, Parameter
    parms = [ Parameter('x', Parameter.POSITIONAL_OR_KEYWORD),
        Parameter('y', Parameter.POSITIONAL_OR_KEYWORD, default=42),
        Parameter('z', Parameter.KEYWORD_ONLY, default=None) ] 
    sig = Signature(parms)

    print(f"{sig = }")  

    def func(*args, **kwargs):
        bound_values = sig.bind(*args, **kwargs)
        for name, value in bound_values.arguments.items():
            print(name,value) 

    print(f"{func(1, 2, z=3) = }")  
    print(f"{func(1) = }")  
    print(f"{func(1, z=3)= }")  
    print(f"{func(y=2, x=1) = }")  
    
    try:
        func(1, 2, 3, 4)
    except TypeError as e:
        print(e)     
    
    try:
        func(y=2)
    except TypeError as e:
        print(e)  

    try:
        func(1, y=2, x=3)
    except TypeError as e:
        print(e)  

def main():
    print('recipe1'.center(20, '*'))
    recipe1()

if __name__ == '__main__':
    main()                